package ventana;

import java.awt.Color;

import model.BuscarAsientosModel;

import org.uqbar.arena.actions.MessageSend;
import org.uqbar.arena.bindings.NotNullObservable;
import org.uqbar.arena.layout.ColumnLayout;
import org.uqbar.arena.layout.HorizontalLayout;
import org.uqbar.arena.widgets.Button;
import org.uqbar.arena.widgets.CheckBox;
import org.uqbar.arena.widgets.Label;
import org.uqbar.arena.widgets.Panel;
import org.uqbar.arena.widgets.Selector;
import org.uqbar.arena.widgets.TextBox;
import org.uqbar.arena.widgets.tables.Column;
import org.uqbar.arena.widgets.tables.Table;
import org.uqbar.arena.windows.SimpleWindow;
import org.uqbar.arena.windows.WindowOwner;

import com.lanchita.excepciones.EstadoErroneoException;

import ar.edu.utn.frba.dds.aterrizar.busquedas.Vuelo;

public class BuscarAsientosWindow extends SimpleWindow<BuscarAsientosModel> {

	public BuscarAsientosWindow(WindowOwner parent, BuscarAsientosModel model) {
		super(parent, model);
		this.getModelObject().clear();
	}
	
	@Override
	protected void createMainTemplate(Panel mainPanel) {
		this.setTitle("Aterrizar.com - Búsqueda de vuelos");
		this.setTaskDescription("Ingrese los parámetros de búsqueda");

		super.createMainTemplate(mainPanel);

		this.createResultsGrid(mainPanel);
		this.createGridActions(mainPanel);
	}

	@Override
	protected void addActions(Panel actionsPanel) {
		new Button(actionsPanel)
			.setCaption("Buscar vuelos")
			.onClick(new MessageSend(this.getModelObject(), "search"))
			.setAsDefault()
			.disableOnError();
			
		new Button(actionsPanel)
			.setCaption("Limpiar")
			.onClick(new MessageSend(this.getModelObject(), "clear"));
		
		new Button(actionsPanel)
			.setCaption("Ver todos los vuelos")
			.onClick(new MessageSend(this.getModelObject(), "verTodosLosVuelos"));
	}

	@Override
	protected void createFormPanel(Panel mainPanel) {
		Panel searchFormPanel = new Panel(mainPanel);
		searchFormPanel.setLayout(new ColumnLayout(4));

		new Label(searchFormPanel).setText("Origen");
		Selector<String> selectorOrigen = new Selector<String>(searchFormPanel).allowNull(false);
		selectorOrigen.bindValueToProperty("origen");
		selectorOrigen.bindItemsToProperty("origenes");
		
		new Label(searchFormPanel).setText("Destino");
		Selector<String> selectorDestino = new Selector<String>(searchFormPanel).allowNull(false);
		selectorDestino.bindValueToProperty("destino");
		selectorDestino.bindItemsToProperty("destinos");

		new Label(searchFormPanel).setText("Fecha").setForeground(Color.BLUE);
		new TextBox(searchFormPanel).bindValueToProperty("fechaSalida");

		new Label(searchFormPanel).setText("Incluir reservados");
		new CheckBox(searchFormPanel).bindValueToProperty("incluirReservados");
		
		new Label(searchFormPanel).setText("Ubicacion").setForeground(Color.BLUE);
		Selector<String> selectorClase = new Selector<String>(searchFormPanel).allowNull(false);
		selectorClase.bindValueToProperty("ubicacion");
		selectorClase.bindItemsToProperty("ubicaciones");
		
		new Label(searchFormPanel).setText("Clases");
		
		Panel panelClases = new Panel(searchFormPanel).setLayout(new HorizontalLayout());
		new Label(panelClases).setText("P");
		new CheckBox(panelClases).bindValueToProperty("clasePrimera");
		new Label(panelClases).setText("E");
		new CheckBox(panelClases).bindValueToProperty("claseEjecutiva");
		new Label(panelClases).setText("T");
		new CheckBox(panelClases).bindValueToProperty("claseTurista");
	}
	
	protected void createResultsGrid(Panel mainPanel) {
		Table<Vuelo> table = new Table<Vuelo>(mainPanel, Vuelo.class);
		table.setHeigth(200);
		table.setWidth(450);

		table.bindItemsToProperty("resultados");
		table.bindValueToProperty("vueloSeleccionado");

		this.describeResultsGrid(table);
	}
	
	protected void describeResultsGrid(Table<Vuelo> table) {
		new Column<Vuelo>(table)
			.setTitle("Aerolinea")
			.setFixedSize(80)
			.bindContentsToTransformer(new AerolineaNameToStringTransformer());

		new Column<Vuelo>(table)
			.setTitle("Vuelo")
			.setFixedSize(100)
			.bindContentsToProperty("codigoDeVuelo");

		new Column<Vuelo>(table)
			.setTitle("Asiento")
			.setFixedSize(25)
			.bindContentsToProperty("codigoDeAsiento");
		
		new Column<Vuelo>(table)
			.setTitle("Origen")
			.setFixedSize(40)
			.bindContentsToProperty("aeroOrigen");
		
		new Column<Vuelo>(table)
			.setTitle("Destino")
			.setFixedSize(40)
			.bindContentsToProperty("aeroDestino");
		
		new Column<Vuelo>(table)
			.setTitle("Precio")
			.setFixedSize(50)
			.bindContentsToProperty("precioBase");

		new Column<Vuelo>(table)
			.setTitle("Ubicacion")
			.setFixedSize(25)
			.bindContentsToProperty("ubicacion");
		
		new Column<Vuelo>(table)
			.setTitle("Clase")
			.setFixedSize(25)
			.bindContentsToProperty("clase");
		
		new Column<Vuelo>(table)
			.setTitle("Estado")
			.setFixedSize(25)
			.bindContentsToProperty("estado");
	}

	protected void createGridActions(Panel mainPanel) {
		Panel botonera = new Panel(mainPanel);
		botonera.setLayout(new HorizontalLayout());

		Button botonComprar = new Button(botonera);
		botonComprar.setCaption("Comprar");
		botonComprar.onClick(new MessageSend(this, "comprarVuelo"));

		Button botonReservas = new Button(botonera);
		botonReservas.setCaption("Reservar");
		botonReservas.onClick(new MessageSend(this, "reservarVuelo"));

		NotNullObservable elementSelected = new NotNullObservable("vueloSeleccionado");
		botonReservas.bindEnabled(elementSelected);
		botonComprar.bindEnabled(elementSelected);
	}
	
	public void comprarVuelo() {
		try {
			this.getModelObject().comprarVuelo();
			new DialogCompraOK(this, getModelObject().getVueloSeleccionado()).open();
			this.getModelObject().search();
		} catch (EstadoErroneoException e) {
			new DialogCompraFallida(this, getModelObject().getVueloSeleccionado()).open();
		} 
	}
	
	public void reservarVuelo() {
		try {
			this.getModelObject().reservarVuelo();
			new DialogReservaOK(this, getModelObject().getVueloSeleccionado()).open();
			this.getModelObject().search();
		} catch (EstadoErroneoException e) {
			new DialogReservaFallida(this, getModelObject().getVueloSeleccionado(), this.getModelObject().getUsuario()).open();
		} 
	}

}
